package com.tul.vapp.servicecenter.util;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import com.tul.cusa.common.log.LogTracerFactory;
import com.tul.cusa.common.log.intf.ILogTracer;
import com.tul.cusa.common.util.PropertiesUtil;
import com.tul.cusa.common.util.StringUtil;
import com.tul.vapp.servicecenter.common.SysConfigConstant;

/**
 * 读谱系统配置文件工具类 Created by jyliu on 2016/9/19.
 */
public class SysConfigUtil {
    /**
     * 日志
     */
    private static final ILogTracer TRACER = LogTracerFactory.getTracer(SysConfigUtil.class);
    /**
     * 系统默认配置文件
     */
    private static final String SYS_DEFAULT_CONFIG_FILE = SysConfigConstant.CONFIG_PROP_FILEPATH;
    /**
     * 配置缓存
     */
    private static final ConcurrentHashMap<String, Properties> CONFIG_MAP = new ConcurrentHashMap();

    /**
     * 从系统默认配置文件中获取配置项
     *
     * @param strKey 配置项key
     * @return 配置项值
     */
    public static String getProperty(String strKey) {
        return getPropertyByClassPath(SYS_DEFAULT_CONFIG_FILE, strKey);
    }

    /**
     * 从指定的配置文件（classpath）中获取配置项
     *
     * @param configPath 配置文件路径
     * @param strKey     配置项key
     * @return 配置项值
     */
    public static String getPropertyByClassPath(String configPath, String strKey) {
        String strValue = "";
        Properties properties = parseConfigProperty(configPath, true);
        if (properties != null) {
            Object obj = properties.get(strKey);
            if (obj != null) {
                strValue = String.valueOf(obj);
            }
        }
        return strValue;
    }

    /**
     * 从指定的配置文件（文件系统）中获取配置项
     *
     * @param configPath 配置文件路径
     * @param strKey     配置项key
     * @return 配置项值
     */
    public static String getPropertyByFilePath(String configPath, String strKey) {
        String strValue = "";
        Properties properties = parseConfigProperty(configPath, false);
        if (properties != null) {
            strValue = (String) properties.get(strKey);
        }
        return strValue;
    }

    /**
     * 从系统默认配置文件中获取配置项
     *
     * @param strKey       配置项key
     * @param defaultValue 默认值
     * @return 配置项值
     */
    public static String getProperty(String strKey, String defaultValue) {
        String strValue = getProperty(strKey);
        if (StringUtil.isEmpty(strValue)) {
            strValue = defaultValue;
        }
        return strValue;
    }

    /**
     * 根据文件路径或路径类型解析properties文件
     *
     * @param configPath    文件路径
     * @param fromClassPath 文件系统还是classpath
     * @return 配置项集合
     */
    private static Properties parseConfigProperty(String configPath, boolean fromClassPath) {
        return CONFIG_MAP.computeIfAbsent(configPath + ":" + fromClassPath, x -> {
            Properties properties = new Properties();
            try {
                if (fromClassPath) {
                    properties.load(
                            Thread.currentThread().getContextClassLoader().getResourceAsStream(configPath));
                } else {
                    properties.load(new FileInputStream(configPath));
                }
            } catch (IOException e) {
                // 不往外抛出异常
                TRACER.error(configPath + " not found!");
            }
            return properties;
        });
    }

    /**
     * 根据文件路径或路径类型获取配置项
     *
     * @param configPath    配置文件路径
     * @param fromClassPath 文件系统还是classpath
     * @return map
     */
    public static Map getConfigProperties(String configPath, boolean fromClassPath) {
        Map<String, String> map = new HashMap();
        try {
            Properties properties = new Properties();
            if (fromClassPath) {
                properties
                        .load(Thread.currentThread().getContextClassLoader().getResourceAsStream(configPath));
            } else {
                properties.load(new FileInputStream(configPath));
            }
            Set<String> propNameList = properties.stringPropertyNames();
            if (!propNameList.isEmpty()) {
                String propValue;
                for (String propName : propNameList) {
                    propValue = properties.getProperty(propName);
                    map.put(propName, propValue);
                }
            }
        } catch (IOException e) {
            // 不往外抛出异常
            TRACER.error(configPath + " not found!");
        }
        return map;
    }

	/**
	 * 获取mapping name
	 *
	 * @return String
	 */
	public static String getAppName() {
		return PropertiesUtil
				.getPropertyByClassPath(SysConfigConstant.CONFIG_PROP_FILEPATH, SysConfigConstant.APP_NAME);
	}

}
